#include "capacitor.h"
//TODO:【功率控制】【超级电容】充电策略 
/*----------------------------------------------------------------------------------------
函数名：void UpdateChargingPower(float power_now, float power_buffer_now, float power_limit)
功  能：充电策略：根据缓冲能来控制充电功率，当缓冲能降到30以下时，目标充电功率为功率限制-8，当缓冲能大于30时，目标充电功率为功率限制+8
调试结果显示功控模块应该会根据当前的底盘电机输出功率和电容内部能量来调整充电功率，我们只是发一个可供参考的极其粗糙的目标值。
----------------------------------------------------------------------------------------*/
void Capacitor::UpdateChargingPower(float power_now, float power_buffer_now, float power_limit)
{
    m_power_buffer_now = power_buffer_now;//裁判系统实时发过来的缓冲能
    m_power_limit = power_limit;//功率上限，看情况调整。
    m_power_now = power_now; //其实用的就是裁判系统实时发过来的功率

	if( m_power_now > m_power_limit )
	{
		m_power_buffer_next = m_power_buffer_now - ( m_power_now - m_power_limit ) * 0.001f ; 
	}
	else
	{
		m_power_buffer_next = m_power_buffer_now ;                                   
	}
	
	if( m_power_buffer_next < 30 )
	{
		m_power_warning = true ;
	}
	else if( m_power_buffer_next >= 60 )
	{
		m_power_warning = false ;
	}	

    if ( m_power_warning ) {
        m_power_charging = m_power_limit - 8.0f;
    } else {
        m_power_charging = m_power_limit + 8.0f;
    }
}


//TODO:【功率控制】【超级电容】放电策略 判断电容状态
/*----------------------------------------------------------------------------------------
函数名：void UpdateOutState(void)
功  能：通过超级电容电压值来判断放电状态,保护电容
----------------------------------------------------------------------------------------*/
void Capacitor::UpdateOutState(void)
{
	// CAP_STATE = Pow_Unlimited;
	if(CAP_STATE == Pow_Unlimited)
	{
		if(m_cap_vol < 28) //que当电容电压小于28时？
		{
			CAP_STATE = Pow_Limited;
			REDICAL_FLAG = 1;
		}
	}

	else if(CAP_STATE == Pow_Limited)
	{
		if(REDICAL_FLAG)
		{
			SetPowDes(200); //que:为什么在功率已经受限的情况下提高我们的上限功率以降低当前实际使用功率百分比？
			if(m_cap_vol < 16) //que:看这样子，貌似是让电容放电？ 
				REDICAL_FLAG = 0;
		}
		else//当前？电压非常小时
		{
			SetPowDes(m_power_limit); 
			if(m_cap_vol > 24)
				REDICAL_FLAG = 1;
			else if(m_cap_vol < 8)
				CAP_STATE = Pow_Stop;//que:为什么电容电压小于8是会把电机关断？
		}
	}

	else if(CAP_STATE == Pow_Stop)
	{
		if(m_cap_vol > 14)  //que:为什么是14？
			CAP_STATE = Pow_Limited;
	}
}



/*----------------------------------------------------------------------------------------
函数名：void SetPowDes(float power_limit)
功  能：功率限制状态下的功率输出更新
----------------------------------------------------------------------------------------*/
 void Capacitor::SetPowDes(float power_limit)
 {
	CAP_POW_USE = m_pow_out/(power_limit*0.95f);//计算百分比，que:为什么乘以0.95呢？更保险？

	if(CAP_POW_USE == 0) CAP_POW_USE = 0.0001;//que:目的何在？
 }



/*----------------------------------------------------------------------------------------
函数名：void CapVolLimit(void)
功  能：检录使用,防止电容电压超出27V ，超过27V时停止充电
----------------------------------------------------------------------------------------*/
void Capacitor::CapVolLimit(void)
{
	if(m_cap_vol > 26.5f)//当cap_vol大于27时或者cap_vol大于26.5并且前一时刻limit_flag为1时，将limit_flag置为1，否则置为0
	{
		if(m_cap_vol > 27.0f || Cap_Vol_Pow_Limit_Flag == 1)
		{
			Cap_Vol_Pow_Limit_Flag = 1;
			m_power_charging = 0; 
		}
	}
	else{
		Cap_Vol_Pow_Limit_Flag = 0;
	}
}